/*
 * 数据类型
 * rust有两种数据类型：标量（scalar）和复合（compound）。
 * 四种基本标量类型：整形，浮点型，布尔型，字符型。（一开始我以为标量和复合就是值类型和引用类型，这里看来不太对）
 *
 * 整形（c#里最常用的int就相当于i32，另外c#里int的定义可以看到其实是Int32，
 * 还有long(Int64),short(Int16)但是没有看到Int8，另外c#里也有无符号类型ushort、uint、ulong等，但是更推荐使用decimal）
 * 长度	    有符号	无符号
 * 8-bit	i8	    u8
 * 16-bit	i16	    u16
 * 32-bit	i32	    u32
 * 64-bit	i64	    u64
 * arch	    isize	usize
 * i32是默认类型
 *
 * 浮点型
 * f32和f64大概相当于c#里的float和double了
 * 这两个大类型都支持用类型名称做后缀
 * 比如 2.0f32 3u8 等
 *
 * 数值运算
 * 加减乘除余基本和c#一样
 *
 * 布尔型
 * 基本和c#一样
 *
 * 字符型
 * rust里的char是Unicode的，所以比c#里的大
 * 在 Rust 中，拼音字母（Accented letters），中文、日文、韩文等字符，emoji（绘文字）以及零长度的空白字符都是有效的 char 值。
 * Unicode 标量值包含从 U+0000 到 U+D7FF 和 U+E000 到 U+10FFFF 在内的值。
 */
pub fn base_type() {
    let a: u8 = 0;
    let b: i64 = 1234 * 5678;
    let c: f64 = 3.15f64;
    let mut d = 0;
    if let Ok(r) = (a * a - a).to_string().parse::<i32>() {
        d = r;   
    };
    let e: char = '😻';
    let f: char = '锈';
    println!("{b} {c} {d} {e} {f}");
}

pub fn array_type() {
    use std::mem::size_of_val;
    let arr: [i32; 8] = [3, 7, 1, 5, 2, 8, 6, 4];
    println!("Array size in main function:{}", &arr[0]);
    println!("Array size in print_array_size function:{}", size_of_val(&arr));
    let mut v = vec![1, 2, 3];
    println!("v has capacity: {}", v.capacity());
    println!("v has {} elements", v.len());
    v.push(5);
    v.push(4);
    println!("v has capacity: {}", v.capacity());
    println!("v has {} elements", v.len());
}
